/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Sablony;

import java.util.Calendar;
import java.util.Date;

/**
 *
 * @author MartinaHlinková
 */
public class PritomnostKlientov implements Comparable<PritomnostKlientov>  {
    Date pociatocnyCas;
    Date konecnyCas;
    Sablony.StavKlienta stavKlienta;
    
    public PritomnostKlientov(Date zaciatok, Date koniec, StavKlienta stav){
       this.konecnyCas = koniec;
       this.pociatocnyCas = zaciatok;
       this.stavKlienta = stav;
    }
    
    public boolean skontrolujSpravnost(){
        if(this.konecnyCas == null || this.pociatocnyCas == null || this.stavKlienta == null){
            return false;
        }
        if(this.konecnyCas.equals(this.pociatocnyCas)== true){
            return false;
        }
        if(this.konecnyCas.after(this.pociatocnyCas) == false){
            return false;
        }
        return true;
    }
    
    public Date getPociatocnyCas(){
        return this.pociatocnyCas;
    }
    
    public Date getKonecnyCas(){
        return this.konecnyCas;
    }
    
    public Sablony.StavKlienta getStavKlienta(){
        return this.stavKlienta;
    }

    public void prepniStavKlienta(){
        if(this.stavKlienta == Sablony.StavKlienta.LAHKY){
            this.stavKlienta = Sablony.StavKlienta.TAZKY;
        }else{
            this.stavKlienta = Sablony.StavKlienta.LAHKY;
        }
    }
    
    public boolean casPatridoPritomnosti(Date cas){
        if(cas == null)return false;
        if(cas.equals(this.getKonecnyCas()) || cas.equals(this.getPociatocnyCas())){
            return true;
        }
        if(cas.after(this.getPociatocnyCas()) && cas.before(this.getKonecnyCas())){
            return true;
        }else return false;
    }

    @Override
    public int compareTo(PritomnostKlientov o) {
        if(this.getPociatocnyCas().after(o.getPociatocnyCas())){
            return (+1);
        }else if(this.getPociatocnyCas().before(o.getPociatocnyCas())){
            return (-1);
        }else{
            if(this.getKonecnyCas().after(o.getKonecnyCas())){
                return (+1);
            }else if(this.getKonecnyCas().before(o.getKonecnyCas())){
                return (-1);
        }
        }
        return 0;
    }
    
    public boolean equals(Object o){
        if(o == this){
            return true;
        }
        if(o instanceof Sablony.PritomnostKlientov == false){
            return false;
        }
        if( ((PritomnostKlientov) o).getPociatocnyCas().equals(this.getPociatocnyCas())){
            if( ((PritomnostKlientov) o).getKonecnyCas().equals(this.getKonecnyCas())) return true;
        }
        return false;
    }
    
    public boolean majuRovnakeIntervaly(Sablony.PritomnostKlientov o){
        if( ((PritomnostKlientov) o).getPociatocnyCas().equals(this.getPociatocnyCas())) return true;
        if( ((PritomnostKlientov) o).getKonecnyCas().equals(this.getKonecnyCas())) return true;
        if( ((PritomnostKlientov) o).getPociatocnyCas().equals(this.getKonecnyCas()))return false;
        if( ((PritomnostKlientov) o).getKonecnyCas().equals(this.getPociatocnyCas())) return false;

        if(this.getPociatocnyCas().after(o.pociatocnyCas) && this.getPociatocnyCas().before(o.getKonecnyCas())){
            return true;
        }
        if(this.getKonecnyCas().after(o.getPociatocnyCas()) && this.getKonecnyCas().before(o.getKonecnyCas())){
            return true;
        }
        if(o.getPociatocnyCas().after(this.pociatocnyCas) && o.getPociatocnyCas().before(this.getKonecnyCas())){
            return true;
        }
        if(o.getKonecnyCas().after(this.getPociatocnyCas()) && o.getKonecnyCas().before(this.getKonecnyCas())){
            return true;
        }
        
         
        return false;
    }
    
    public String[] pritomnostToArray(){
        String[] pritomnost = new String[3];
        
        pritomnost[0] = this.getPociatocnyCas().toString();
        pritomnost[1] = this.getKonecnyCas().toString();
        if(this.getStavKlienta() == Sablony.StavKlienta.LAHKY){
            pritomnost[2] = "LAHKY";
        }else{
            pritomnost[2] = "TAZKY";
        }
        
        return pritomnost;
    }
    
    public String toString(){
        String navrat = ""+this.getPociatocnyCas().toString()+" : "+this.getKonecnyCas().toString()+" : ";
        if(this.getStavKlienta() ==Sablony.StavKlienta.LAHKY){
            return navrat + "Lahky";
        }else{
            return navrat + "Tazky";
        }
    }
    
    public static void main(String[] args){
        System.out.println("**************************************");
        System.out.println("*Pokusny test s pritomnostou klientov*");
        System.out.println("**************************************");
        
        Date pokusnyDateZaciatok = new Date(113,5,1,8,30,0);
        Date pokusnyDateKoniec = new Date(113,5,10,9,30,0);
        
        Date predZaciatkom = new Date(113,4,22,7,30,0);
        Date medziDatum = new Date(113,5,3,10,45,0);
        Date medziDatum2 = new Date(113,5,4,10,45,0);
        Date poKonci = new Date(113,5,15,8,30,0);
        Date poKonci2 = new Date(113,5,20,8,30,0);
        
        Sablony.PritomnostKlientov pokus = new Sablony.PritomnostKlientov(pokusnyDateZaciatok,pokusnyDateKoniec , StavKlienta.TAZKY);
        System.out.println(pokus);
        
        System.out.println("Pokus s rovnakymi zaciatkami");
        Sablony.PritomnostKlientov rovnakeZaciatky = new Sablony.PritomnostKlientov(pokusnyDateZaciatok,poKonci , StavKlienta.TAZKY);
        if(pokus.majuRovnakeIntervaly(rovnakeZaciatky) == true){
            System.out.println("pokus vysiel s datumom "+rovnakeZaciatky);
        }
        
        System.out.println("Pokus s rovnakymi koncami");
        Sablony.PritomnostKlientov rovnakeKonce  = new Sablony.PritomnostKlientov(medziDatum,pokusnyDateKoniec , StavKlienta.TAZKY);
        if(pokus.majuRovnakeIntervaly(rovnakeKonce) == true){
            System.out.println("pokus vysiel s datumom "+rovnakeKonce);
        }
        
        System.out.println("Pokus s nadvazovanim cislo 1");
        Sablony.PritomnostKlientov nadvazovanie1  = new Sablony.PritomnostKlientov(predZaciatkom,pokusnyDateZaciatok , StavKlienta.TAZKY);
        if(pokus.majuRovnakeIntervaly(nadvazovanie1) == false){
            System.out.println("pokus vysiel s datumom "+nadvazovanie1);
        }
        
        System.out.println("Pokus s nadvazovanim cislo 2");
        Sablony.PritomnostKlientov nadvazovanie2  = new Sablony.PritomnostKlientov(pokusnyDateKoniec,poKonci , StavKlienta.TAZKY);
        if(pokus.majuRovnakeIntervaly(nadvazovanie2) == false){
            System.out.println("pokus vysiel s datumom "+nadvazovanie2);
        }
        
        System.out.println("Pokus s prekryvanim cislo1");
        Sablony.PritomnostKlientov prekryvanie1  = new Sablony.PritomnostKlientov(predZaciatkom,medziDatum , StavKlienta.TAZKY);
        if(pokus.majuRovnakeIntervaly(prekryvanie1) == true){
            System.out.println("pokus vysiel s datumom "+prekryvanie1);
        }
        
        System.out.println("Pokus s prekryvanim cislo2");
        Sablony.PritomnostKlientov prekryvanie2  = new Sablony.PritomnostKlientov(medziDatum,poKonci , StavKlienta.TAZKY);
        if(pokus.majuRovnakeIntervaly(prekryvanie2) == true){
            System.out.println("pokus vysiel s datumom "+prekryvanie2);
        }
        
        System.out.println("Pokus s prekryvanim cislo3");
        Sablony.PritomnostKlientov prekryvanie3  = new Sablony.PritomnostKlientov(medziDatum,medziDatum2 , StavKlienta.TAZKY);
        if(pokus.majuRovnakeIntervaly(prekryvanie3) == true){
            System.out.println("pokus vysiel s datumom "+prekryvanie3);
        }
        
        System.out.println("Pokus s prekryvanim cislo4");
        Sablony.PritomnostKlientov prekryvanie4  = new Sablony.PritomnostKlientov(predZaciatkom,poKonci , StavKlienta.TAZKY);
        if(pokus.majuRovnakeIntervaly(prekryvanie4) == true){
            System.out.println("pokus vysiel s datumom "+prekryvanie4);
        }
        
        System.out.println("Absolutne neprekryvanie");
        Sablony.PritomnostKlientov neprekryvanie  = new Sablony.PritomnostKlientov(poKonci,poKonci2 , StavKlienta.TAZKY);
        if(pokus.majuRovnakeIntervaly(neprekryvanie) == false){
            System.out.println("pokus vysiel s datumom "+neprekryvanie);
        }
        
        System.out.println("testy metody casPartiDoPritomnosti");
        if(pokus.casPatridoPritomnosti(poKonci2) == false){
            System.out.println("Sprvane identifikovanie, ze nepatri do intervali pritomnosti "+poKonci2);
        }
        if(pokus.casPatridoPritomnosti(medziDatum) == true){
            System.out.println("Sprvane identifikovanie, ze patri do intervali pritomnosti "+medziDatum);
        }
        if(pokus.casPatridoPritomnosti(pokusnyDateZaciatok) == true){
            System.out.println("Sprvane identifikovanie, ze patri do intervali pritomnosti - zaciatok "+pokusnyDateZaciatok);
        }
        if(pokus.casPatridoPritomnosti(pokusnyDateKoniec) == true){
            System.out.println("Sprvane identifikovanie, ze patri do intervali pritomnosti - koniec "+pokusnyDateKoniec);
        }
    }
}
